#ifndef JMODULE_H
#define JMODULE_H

#include <QTECore/qteglobal.h>
#include <functional>

namespace QTE
{

/*
	模块初始化
	必须在源文件中注册， 且只能写一次

	initFunc 初始化函数（可以是lambda）
	level 优先级，越小越高

	调用结束后会释放初始化列表（再次调用什么也不干，直接返回）
*/
#define QTE_module_init(initFunc, level) \
	namespace QTE { \
	extern int __QTE_module_init_register(const std::function<void(void)>&, uint); } \
	static int __attribute_used__ __QTE_module_init_register_return = \
	QTE::__QTE_module_init_register(initFunc, level)

// 在main函数中调用一次，完成所有模块的初始化
QTECORE_EXPORT void QTE_module_init_run(int msecs = -1);

#define QTE_module_exit(exitFunc) \
	namespace QTE { \
	extern int __QTE_module_exit_register(const std::function<void(int)>&); } \
	static int __attribute_used__ __QTE_module_exit_register_return = \
	QTE::__QTE_module_exit_register(exitFunc)

QTECORE_EXPORT void QTE_exit_run(int exitCode);

} //namespace QTE


#endif //JMODULE_H
